package com.huluobo.mvvmdemo2006a.repo;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;

import com.huluobo.mvvmdemo2006a.model.CartItem;
import com.huluobo.mvvmdemo2006a.model.Product;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by lc on 2023/1/6.
 * 购物车的数据仓库
 */
public class CartRepo {
    //购物车中商品的LiveData
    private MutableLiveData<List<CartItem>> mutableCart = new MutableLiveData<>();

    //购物车中商品的总价
    private MutableLiveData<Double> mutableTotalPrice = new MutableLiveData<>();

    //得到所有购物车数据的方法
    public LiveData<List<CartItem>> getCart() {
        if (mutableCart.getValue() == null) {
            initCart();
        }
        return mutableCart;
    }

    //初始化LiveData的方法
    public void initCart() {
        mutableCart.setValue(new ArrayList<CartItem>());
        calculateCartTotal();
    }

    //添加购物车数据的方法
    public boolean addItemToCart(Product product) {
        if (mutableCart.getValue() == null) {
            initCart();
        }

        //拿出现有的LiveData数据,来给集合赋值
        List<CartItem> cartItemList = new ArrayList<>(mutableCart.getValue());

        //需要拿到原始的数据源进行去重操作
        for (CartItem cartItem : cartItemList) {
            if (cartItem.getProduct().getId().equals(product.getId())) {
                if (cartItem.getQuantity() == 5) {
                    return false;
                }

                int index = cartItemList.indexOf(cartItem);
                cartItem.setQuantity(cartItem.getQuantity() + 1);
                cartItemList.set(index, cartItem);

                mutableCart.setValue(cartItemList);
                calculateCartTotal();
                return true;
            }
        }

        CartItem cartItem = new CartItem(product, 1);
        cartItemList.add(cartItem);

        mutableCart.setValue(cartItemList);
        calculateCartTotal();
        return true;
    }

    //移除购物车中数据的方法
    public void removeItemFromCart(CartItem cartItem) {
        if (mutableCart.getValue() != null) {
            List<CartItem> cartItemList = new ArrayList<>(mutableCart.getValue());//拿到现有的数据源来进行赋值

            cartItemList.remove(cartItem);
            mutableCart.setValue(cartItemList);
        }
        calculateCartTotal();
    }

    //修改购物车中商品的数量
    public void changeQuantity(CartItem cartItem, int quantity) {
        if (mutableCart.getValue() != null) {
            List<CartItem> cartItemList = new ArrayList<>(mutableCart.getValue());
            CartItem updatedItem = new CartItem(cartItem.getProduct(), quantity);
            cartItemList.set(cartItemList.indexOf(cartItem), updatedItem);
            mutableCart.setValue(cartItemList);
        }
        calculateCartTotal();
    }

    private void calculateCartTotal() {
        if (mutableCart.getValue() != null) {
            double total = 0.0;
            List<CartItem> cartItemList = new ArrayList<>(mutableCart.getValue());
            for (CartItem cartItem : cartItemList) {
                total += cartItem.getProduct().getPrice() * cartItem.getQuantity();
            }
            mutableTotalPrice.setValue(total);
        }
    }

    public LiveData<Double> getTotalPrice() {
        if (mutableCart.getValue() == null) {
            mutableTotalPrice.setValue(0.0);
        }
        return mutableTotalPrice;
    }
}
